/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ia_psr.graph;

/**
 *
 * @author Rubén Avalos Elvira y Fabiana Celiberti Tapie
 */

import java.util.ArrayList;
import java.util.Iterator;

public class Grafo {
    protected ArrayList<Nodo> nodos;

    public Grafo() {
        nodos = new ArrayList<Nodo>();
    }

    public Iterator getIterator() {
        return nodos.iterator();
    }

    public boolean addNodo(Nodo n) {
        return nodos.add(n);
    }

    public boolean removeNodo(Nodo n) {
        return nodos.remove(n);
    }

    public boolean addArista(Nodo n, Arista a) {
        int i;
        if ((i = nodos.indexOf(n)) != -1) {
            nodos.get(i).addArista(a);
            return true;
        }
        System.out.println("El nodo especificado no existe");
        return false;
    }

    public boolean addArista(String nombre, Arista a) {
        int i;
        for (i = 0; i < nodos.size(); ++i) {
            if (nodos.get(i).nombre.equals(nombre)) {
                nodos.get(i).addArista(a);
                return true;
            }
        }
        System.out.println("El nodo especificado no existe");
        return false;
    }
    
    public boolean addArista(Nodo n1, Nodo n2) {
        Arista a = new Arista(n1, n2);
        
        return addArista(n1, a);
    }

    public boolean addArista(String n1, String n2) {
        Nodo nodo1 = getNodo(n1);
        Nodo nodo2 = getNodo(n2);
        
        return addArista(nodo1, new Arista(nodo1, nodo2));
    }

    public Nodo getNodo(String nombre) {
        for (Nodo n : nodos) {
            if (n.nombre.equals(nombre))
                return n;
        }
        System.out.println("El nodo especificado no existe");
        return null;
    }

    public ArrayList<Nodo> getNodos() {
        return nodos;
    }

    public void setNodos(ArrayList<Nodo> nodos) {
        this.nodos = (ArrayList<Nodo>)nodos.clone();
    }

    public static boolean adjacents(Nodo n1, Nodo n2) {
        for (Arista a : n1.aristas) {
            if (a.destino.equals(n2))
                return true;
        }
        return false;
    }
}
